using System;
using System.Collections.Generic;
using Csla;
using ENT.GP.Datos.MysqlHelper;
using System.Data;
using MySql.Data.MySqlClient;

namespace ENT.GP.Core.Proyecto
{
    [Serializable]
    public class ProyectosDesembolsos :
      BusinessListBase<ProyectosDesembolsos, ProyectoDesembolso>
    {
        #region Factory Methods

        internal static ProyectosDesembolsos NewProyectosDesembolsos()
        {
            return DataPortal.CreateChild<ProyectosDesembolsos>();
        }

        internal static ProyectosDesembolsos GetProyectosDesembolsos(int idProy)
        {
            return DataPortal.FetchChild<ProyectosDesembolsos>(idProy);
        }

        private ProyectosDesembolsos()
        { }

        #endregion

        #region Data Access

        private void Child_Fetch(int idProy)
        {
            RaiseListChangedEvents = false;

            HelperMySql objhm = HelperMySql.ObtenerConexion("");
            MySql.Data.MySqlClient.MySqlParameter[] parametros = new MySql.Data.MySqlClient.MySqlParameter[1];
            parametros[0] = new MySql.Data.MySqlClient.MySqlParameter("IDP", idProy);
            foreach (DataRow items in objhm.EjecutarStoreProcedure(parametros, "Obtener_Lista_Desembolsos").Tables[0].Rows)
            {
                this.Add(ProyectoDesembolso.GetProyectoDesembolso(items));
            }

            RaiseListChangedEvents = true;
        }

        #endregion
    }


    [Serializable]
    public class ProyectoDesembolso : BusinessBase<ProyectoDesembolso>
    {
        #region Business Methods
               
        private static PropertyInfo<int> IdProperty = RegisterProperty<int>(o => o.Id, "Name");
        public int Id
        {
            get { return GetProperty(IdProperty); }
            set { SetProperty(IdProperty, value); }
        }

        private static PropertyInfo<int> ProyectoIdProperty = RegisterProperty<int>(o => o.ProyectoId, "Name");
        public int ProyectoId
        {
            get { return GetProperty(ProyectoIdProperty); }
            set { SetProperty(ProyectoIdProperty, value); }
        }

        private static PropertyInfo<DateTime> FechaProperty = RegisterProperty<DateTime>(o => o.Fecha, "Name");
        public DateTime Fecha
        {
            get { return GetProperty(FechaProperty); }
            set { SetProperty(FechaProperty, value); }
        }

        private static PropertyInfo<double> OtrosDescuentosProperty = RegisterProperty<double>(o => o.OtrosDescuentos, "Name");
        public double OtrosDescuentos
        {
            get { return GetProperty(OtrosDescuentosProperty); }
            set { SetProperty(OtrosDescuentosProperty, value); }
        }

        private static PropertyInfo<string> ResponsableProperty = RegisterProperty<string>(o => o.Responsable, "Name");
        public string Responsable
        {
            get { return GetProperty(ResponsableProperty); }
            set { SetProperty(ResponsableProperty, value); }
        }

        private static PropertyInfo<double> SaldoProperty = RegisterProperty<double>(o => o.Saldo, "Name");
        public double Saldo
        {
            get { return GetProperty(SaldoProperty); }
            set { SetProperty(SaldoProperty, value); }
        }

        private static PropertyInfo<double> ValorPlanillaProperty = RegisterProperty<double>(o => o.ValorPlanilla, "Name");
        public double ValorPlanilla
        {
            get { return GetProperty(ValorPlanillaProperty); }
            set { SetProperty(ValorPlanillaProperty, value); }
        }

        private static PropertyInfo<int> TipoTransaccionProperty = RegisterProperty<int>(o => o.TipoTransaccion, "Name");
        public int TipoTransaccion
        {
            get { return GetProperty(TipoTransaccionProperty); }
            set { SetProperty(TipoTransaccionProperty, value); }
        }

        private static PropertyInfo<double> DescSupervisionProperty = RegisterProperty<double>(o => o.DescSupervision, "Name");
        public double DescSupervision
        {
            get { return GetProperty(DescSupervisionProperty); }
            set { SetProperty(DescSupervisionProperty, value); }
        }

        private static PropertyInfo<double> ValSupervisionProperty = RegisterProperty<double>(o => o.ValSupervision, "Name");
        public double ValSupervision
        {
            get { return GetProperty(ValSupervisionProperty); }
            set { SetProperty(ValSupervisionProperty, value); }
        }

        private static PropertyInfo<double> DesDifusionProperty = RegisterProperty<double>(o => o.DesDifusion, "Name");
        public double DesDifusion
        {
            get { return GetProperty(DesDifusionProperty); }
            set { SetProperty(DesDifusionProperty, value); }
        }

        private static PropertyInfo<double> ValDifusionProperty = RegisterProperty<double>(o => o.ValDifusion, "Name");
        public double ValDifusion
        {
            get { return GetProperty(ValDifusionProperty); }
            set { SetProperty(ValDifusionProperty, value); }
        }

        private static PropertyInfo<double> MontoTransferirProperty = RegisterProperty<double>(o => o.MontoTransferir, "Name");
        public double MontoTransferir
        {
            get { return GetProperty(MontoTransferirProperty); }
            set { SetProperty(MontoTransferirProperty, value); }
        }

        private static PropertyInfo<string> ObservacionProperty = RegisterProperty<string>(o => o.Observacion, "Name");
        public string Observacion
        {
            get { return GetProperty(ObservacionProperty); }
            set { SetProperty(ObservacionProperty, value); }
        }


        //
        private static PropertyInfo<Documentos> DocumentosDesembolsosProperty = RegisterProperty<Documentos>(o => o.DocumentosDesembolsos);
        /// <summary>
        /// Obtiene o Establece la Lista de Documentos asociados al perfil del proyecto
        /// </summary>
        public Documentos DocumentosDesembolsos
        {
            get
            {
                if (!(FieldManager.FieldExists(DocumentosDesembolsosProperty)))
                    if (this.IsNew)
                        LoadProperty(DocumentosDesembolsosProperty, Documentos.NewDocumentos());
                    else
                        LoadProperty(DocumentosDesembolsosProperty, Documentos.GetDocumentos(ReadProperty(ProyectoIdProperty), 6,0, ReadProperty(IdProperty)));
                return GetProperty(DocumentosDesembolsosProperty);
            }
        }

        #endregion

        #region Validation Rules

        protected override void AddBusinessRules()
        {
            // TODO: add validation rules
            //ValidationRules.AddRule(RuleMethod, "");
        }

        #endregion

        #region Authorization Rules

        protected override void AddAuthorizationRules()
        {
            // TODO: add authorization rules
            //AuthorizationRules.AllowWrite("Name", "Role");
        }

        private static void AddObjectAuthorizationRules()
        {
            // TODO: add authorization rules
            //AuthorizationRules.AllowEdit(typeof(ProyectoDesembolso), "Role");
        }

        #endregion

        #region Factory Methods

        internal static ProyectoDesembolso NewProyectoDesembolso()
        {
            return DataPortal.CreateChild<ProyectoDesembolso>();
        }

        public static ProyectoDesembolso GetProyectoDesembolso(int id)
        {
            return DataPortal.FetchChild<ProyectoDesembolso>(id);
        }

        internal static ProyectoDesembolso GetProyectoDesembolso(DataRow childData)
        {
            return DataPortal.FetchChild<ProyectoDesembolso>(childData);
        }

        public ProyectoDesembolso()
        { /* Require use of factory methods */ }

        #endregion

        #region Data Access

        protected override void Child_Create()
        {
            // TODO: load default values
            // omit this override if you have no defaults to set
            base.Child_Create();
        }

        private void Child_Fetch(int id)
        {
        }
        private void Child_Fetch(DataRow childData)
        {
            LoadProperty(IdProperty, Convert.ToInt32(childData[0].ToString()));
            LoadProperty(FechaProperty,Convert.ToDateTime( childData[1].ToString()));
            LoadProperty(OtrosDescuentosProperty, Convert.ToDouble(childData[2].ToString()));
            LoadProperty(ResponsableProperty, childData[3].ToString());
            LoadProperty(SaldoProperty, Convert.ToDouble(childData[4].ToString()));
            LoadProperty(ValorPlanillaProperty, Convert.ToDouble(childData[5].ToString()));            
            LoadProperty(TipoTransaccionProperty, Convert.ToInt32( childData[6].ToString()));
            LoadProperty(DescSupervisionProperty, Convert.ToDouble(childData[7].ToString()));
            LoadProperty(ValSupervisionProperty, Convert.ToDouble(childData[8].ToString()));
            LoadProperty(DesDifusionProperty, Convert.ToDouble(childData[9].ToString()));
            LoadProperty(ValDifusionProperty, Convert.ToDouble(childData[10].ToString()));
            LoadProperty(MontoTransferirProperty, Convert.ToDouble(childData[11].ToString()));
            LoadProperty(ObservacionProperty, childData[12].ToString());
            LoadProperty(ProyectoIdProperty, Convert.ToInt32(childData[13].ToString()));
        }

        private void Child_Insert(int parent)
        {
            HelperMySql objhm = HelperMySql.ObtenerConexion("");
            MySql.Data.MySqlClient.MySqlParameter[] parametros = new MySql.Data.MySqlClient.MySqlParameter[13];
            try
            {
                parametros[0] = new MySql.Data.MySqlClient.MySqlParameter("F", Fecha);
                parametros[1] = new MySql.Data.MySqlClient.MySqlParameter("OD", ReadProperty(OtrosDescuentosProperty));
                parametros[2] = new MySql.Data.MySqlClient.MySqlParameter("R", ReadProperty(ResponsableProperty));
                parametros[3] = new MySql.Data.MySqlClient.MySqlParameter("S", ReadProperty(SaldoProperty));
                parametros[4] = new MySql.Data.MySqlClient.MySqlParameter("VP", ReadProperty(ValorPlanillaProperty));
                parametros[5] = new MySql.Data.MySqlClient.MySqlParameter("TT", ReadProperty(TipoTransaccionProperty));
                parametros[6] = new MySql.Data.MySqlClient.MySqlParameter("DS", ReadProperty(DescSupervisionProperty));
                parametros[7] = new MySql.Data.MySqlClient.MySqlParameter("VS", ReadProperty(ValSupervisionProperty));
                parametros[8] = new MySql.Data.MySqlClient.MySqlParameter("DD", ReadProperty(DesDifusionProperty));
                parametros[9] = new MySql.Data.MySqlClient.MySqlParameter("VD", ReadProperty(ValDifusionProperty));
                parametros[10] = new MySql.Data.MySqlClient.MySqlParameter("MT", ReadProperty(MontoTransferirProperty));
                parametros[11] = new MySql.Data.MySqlClient.MySqlParameter("O", ReadProperty(ObservacionProperty));
                parametros[12] = new MySql.Data.MySqlClient.MySqlParameter("IDP", parent);

                 var idDes = Convert.ToInt32(objhm.EjecutarStoreProcedure("Insertar_Proyecto_Desembolso", parametros,1));
                 Id = idDes;
                 FieldManager.UpdateChildren(parent, Id);
            }
            catch (Exception)
            {

                throw;
            }
        }

        private void Child_Update(int parent)
        {
            HelperMySql objhm = HelperMySql.ObtenerConexion("");
            MySql.Data.MySqlClient.MySqlParameter[] parametros = new MySql.Data.MySqlClient.MySqlParameter[14];
            try
            {
                parametros[0] = new MySql.Data.MySqlClient.MySqlParameter("F", Fecha);
                parametros[1] = new MySql.Data.MySqlClient.MySqlParameter("OD", ReadProperty(OtrosDescuentosProperty));
                parametros[2] = new MySql.Data.MySqlClient.MySqlParameter("R", ReadProperty(ResponsableProperty));
                parametros[3] = new MySql.Data.MySqlClient.MySqlParameter("S", ReadProperty(SaldoProperty));
                parametros[4] = new MySql.Data.MySqlClient.MySqlParameter("VP", ReadProperty(ValorPlanillaProperty));
                parametros[5] = new MySql.Data.MySqlClient.MySqlParameter("TT", ReadProperty(TipoTransaccionProperty));
                parametros[6] = new MySql.Data.MySqlClient.MySqlParameter("DS", ReadProperty(DescSupervisionProperty));
                parametros[7] = new MySql.Data.MySqlClient.MySqlParameter("VS", ReadProperty(ValSupervisionProperty));
                parametros[8] = new MySql.Data.MySqlClient.MySqlParameter("DD", ReadProperty(DesDifusionProperty));
                parametros[9] = new MySql.Data.MySqlClient.MySqlParameter("VD", ReadProperty(ValDifusionProperty));
                parametros[10] = new MySql.Data.MySqlClient.MySqlParameter("MT", ReadProperty(MontoTransferirProperty));
                parametros[11] = new MySql.Data.MySqlClient.MySqlParameter("O", ReadProperty(ObservacionProperty));
                parametros[12] = new MySql.Data.MySqlClient.MySqlParameter("ID", ReadProperty(IdProperty));
                parametros[13] = new MySql.Data.MySqlClient.MySqlParameter("IDP", parent);

                objhm.EjecutarStoreProcedure("Actualizar_Proyecto_Desembolso", parametros);

            }
            catch (Exception)
            {

                throw;
            }
        }

        private void Child_DeleteSelf(object parent)
        {
            HelperMySql objhm = HelperMySql.ObtenerConexion("");
            MySqlParameter[] parametros = new MySqlParameter[2];
            try
            {
                parametros[0] = new MySql.Data.MySqlClient.MySqlParameter("IDP", ReadProperty(ProyectoIdProperty));
                parametros[1] = new MySql.Data.MySqlClient.MySqlParameter("IDD", ReadProperty(IdProperty));                
                objhm.EjecutarStoreProcedure("Eliminar_Proyecto_Desembolso", parametros);
            }
            catch (Exception)
            {
                throw;
            }
        }

        #endregion
    }
}
